package com.pactera.madp.cp.common.util.sync;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.ftp.FtpConfig;
import cn.hutool.extra.ssh.Sftp;
import lombok.experimental.UtilityClass;

import java.io.File;
import java.util.List;

/**
 * FTP文件下载工具
 */
@UtilityClass
public class SFTPUtils {

    public synchronized boolean checkFile(FtpConfig ftpConfig, String filepath) {
        if (StrUtil.isEmpty(filepath)) {
            throw new IllegalArgumentException("目标文件不能为空");
        }

        Sftp sftp = null;
        try {
            // 连接服务器
            sftp = new Sftp(ftpConfig);
            return sftp.exist(filepath);
        } finally {
            if (ObjectUtil.isNotNull(sftp)) {
                sftp.close();
            }
        }
    }

    public synchronized boolean download(FtpConfig ftpConfig, String srcFile, String destFile) {
        if (StrUtil.isEmpty(srcFile)) {
            throw new IllegalArgumentException("目标文件不能为空");
        }
        if (StrUtil.isEmpty(destFile)) {
            throw new IllegalArgumentException("下载文件不能为空");
        }

        Sftp sftp = null;
        try {
            // 连接服务器
            sftp = new Sftp(ftpConfig);
            if (!sftp.exist(srcFile)) {
                return false;
            }
            // 文件下载
            sftp.download(srcFile, new File(destFile));
        } finally {
            if (ObjectUtil.isNotNull(sftp)) {
                sftp.close();
            }
        }
        return true;
    }

    public synchronized boolean downloadBatchFile(FtpConfig ftpConfig, String sourceDir, String destDir) {
        if (StrUtil.isEmpty(sourceDir)) {
            throw new IllegalArgumentException("目标目录不能为空");
        }
        if (StrUtil.isEmpty(destDir)) {
            throw new IllegalArgumentException("下载目录不能为空");
        }

        Sftp sftp = null;
        try {
            // 连接服务器
            sftp = new Sftp(ftpConfig);
            if (!sftp.exist(sourceDir)) {
                return false;
            }
            List<String> fileNameList = sftp.ls(sourceDir);
            fileNameList.removeIf(s -> !s.startsWith("CN_"));
            Sftp finalSftp = sftp;
            fileNameList.forEach(s -> {
                // 文件下载
                String sourcePath = sourceDir + File.separator + s;
                sourcePath = sourcePath.replaceAll("\\\\", "/");
                finalSftp.download(sourcePath, new File(destDir + s));
            });
        } finally {
            if (ObjectUtil.isNotNull(sftp)) {
                sftp.close();
            }
        }
        return true;
    }

    public synchronized boolean recursiveDownloadFolder(FtpConfig ftpConfig, String sourcePath, String destFile) {
        if (StrUtil.isEmpty(sourcePath)) {
//            throw new IllegalArgumentException("目标文件不能为空");
            return false;
        }
        if (StrUtil.isEmpty(destFile)) {
//            throw new IllegalArgumentException("下载文件不能为空");
            return false;
        }

        Sftp sftp = null;
        try {
            // 连接服务器
            sftp = new Sftp(ftpConfig);
            if (!sftp.exist(sourcePath)) {
                System.out.println(sourcePath + "不存在于sftp服务器");
                return false;
            }
            // 文件下载
            sftp.recursiveDownloadFolder(sourcePath, new File(destFile));
        } finally {
            if (ObjectUtil.isNotNull(sftp)) {
                sftp.close();
            }
        }
        return true;
    }

    public synchronized boolean upload(FtpConfig ftpConfig, String srcFile, String destFile) {
        if (StrUtil.isEmpty(srcFile)) {
            throw new IllegalArgumentException("目标文件不能为空");
        }
        if (StrUtil.isEmpty(destFile)) {
            throw new IllegalArgumentException("下载文件不能为空");
        }

        Sftp sftp = null;
        try {
            // 连接服务器
            sftp = new Sftp(ftpConfig);
            sftp.upload(destFile, new File(srcFile));
        } finally {
            if (ObjectUtil.isNotNull(sftp)) {
                sftp.close();
            }
        }
        return true;
    }

    public synchronized List<String> ls(FtpConfig ftpConfig, String srcDir) {
        Sftp sftp = null;
        List<String> fileNames = null;
        try {
            // 连接服务器
            sftp = new Sftp(ftpConfig);
            fileNames = sftp.ls(srcDir);
        } finally {
            if (ObjectUtil.isNotNull(sftp)) {
                sftp.close();
            }
        }
        return fileNames;
    }

    /*public static void main(String[] args) {
        FtpConfig ftpConfig = new FtpConfig();
        ftpConfig.setHost("183.60.98.92");
        ftpConfig.setPort(22);
        ftpConfig.setUser("ifm30");
        ftpConfig.setPassword("P@cteraBG2M*dp");
        ftpConfig.setConnectionTimeout(15000);
        ftpConfig.setSoTimeout(15000);
        ftpConfig.setCharset(Charset.defaultCharset());
        Sftp sftp = null;
        try {
            // 连接服务器
            sftp = new Sftp(ftpConfig);
            List<String> names = sftp.ls("./backup/Product1");
            for (String s : names) {
                System.out.println(s);
            }
        } finally {
            if (ObjectUtil.isNotNull(sftp)) {
                sftp.close();
            }
        }
    }*/

}
